🔗 Bağlı Liste (Linked List) Uzunluğu Nasıl Bulunur?
Bu Rehberde Ne Öğreneceksiniz?
Bu rehberde, bağlı liste (Linked List) veri yapısının uzunluğunu bulmanın iki temel yöntemini öğreneceksiniz:
1️⃣ Yinelemeli (Iterative) yöntem — döngüyle sayma,
2️⃣ Özyinelemeli (Recursive) yöntem — fonksiyon çağrısıyla sayma.
Her iki yaklaşımı da hem C hem Java dillerinde pratik kod örnekleriyle adım adım inceleyeceğiz.
🧠 1. Bağlı Liste Nedir?
Bağlı liste, verileri doğrusal şekilde saklayan dinamik bir veri yapısıdır.
Her eleman bir düğüm (Node) olarak adlandırılır ve iki ana bölümden oluşur:
- Veri (Data): Değerin kendisini içerir.
- İşaretçi (Next): Sonraki düğümün adresini gösterir.
Listenin sonundaki düğümün next değeri daima NULL olur.
📘 Özet:
Bağlı liste = “veri + sonraki düğüm adresi” kombinasyonuna sahip zincir yapısıdır.
⚙️ 2. Bağlı Liste Uzunluğunu Bulma Yöntemleri
Bir bağlı listedeki toplam düğüm sayısını (uzunluğunu) bulmak için iki yöntem kullanılır:
| Yöntem | Açıklama |
|---|---|
| Yinelemeli (Iterative) | Döngü kullanarak düğümleri tek tek gezip sayar. |
| Özyinelemeli (Recursive) | Fonksiyonun kendisini çağırmasıyla her düğümü sayar. |
🔢 3. Yinelemeli (Iterative) Yaklaşım
Bu yöntem, listenin başından başlayarak her düğümü gezer ve sayaç artırarak toplam uzunluğu döndürür.
📋 Adımlar:
countdeğişkenini 0 olarak başlat.tempişaretçisinihead’e ata.temp != NULLoldukça:count++yap.temp = temp.nextile sonraki düğüme geç.
- Döngü bittiğinde
countdeğeri listenin uzunluğudur.
☕ Java Kod Örneği
public int length() {
Node temp = this.head;
int count = 0;
while (temp != null) {
count++;
temp = temp.next;
}
return count;
}
🧩 Bu metot, bağlı listedeki her düğümü tek tek sayarak toplam uzunluğu döndürür.
💻 C Kod Örneği
int getLength(struct node *head) {
int length = 0;
while (head != NULL) {
head = head->next; // Sonraki düğüme ilerle
length++; // Sayaç artır
}
return length;
}
🧠 Bu fonksiyon, her düğümü ziyaret ederek toplam düğüm sayısını hesaplar.
🔁 4. Özyinelemeli (Recursive) Yaklaşım
Özyineleme (recursion), bir fonksiyonun kendini çağırarak sorunu daha küçük alt parçalara bölmesidir. Bu yöntem, kodun daha kısa ve anlaşılır olmasını sağlar.
📘 Mantık: Temel Durum (Base Case): Düğüm NULL olduğunda 0 döndür.
Özyinelemeli Durum: 1 + getCount(next_node) formülüyle ilerle.
☕ Java Kod Örneği
public int lengthUsingRecursiveApproach() {
return lengthUsingRecursiveApproach(this.head);
}
private int lengthUsingRecursiveApproach(Node curr) {
if (curr == null)
return 0;
return 1 + lengthUsingRecursiveApproach(curr.next);
}
🧩 Her düğümde 1 eklenir ve fonksiyon kendini çağırarak liste sonuna ulaşır.
💻 C Kod Örneği
int getCount(struct Node* head) {
if (head == NULL)
return 0;
return 1 + getCount(head->next);
}
📘 Her fonksiyon çağrısı bir düğüm sayar, sonunda toplam uzunluk elde edilir.
🧮 5. Zaman Karmaşıklığı ve Performans
Her iki yöntem de listenin tüm düğümlerini bir kez ziyaret eder. Bu nedenle zaman karmaşıklığı aynıdır:
| Yaklaşım | Zaman Karmaşıklığı | Ekstra Bellek Kullanımı |
|---|---|---|
| Yinelemeli (Iterative) | O(N) | O(1) |
| Özyinelemeli (Recursive) | O(N) | O(N) (fonksiyon çağrı yığını için) |
🧠 N = listedeki düğüm sayısıdır.
❓ 6. Sıkça Sorulan Sorular (SSS)
1. Yinelemeli ve Özyinelemeli farkı nedir?
Yinelemeli yöntem daha az bellek kullanır ve genellikle daha hızlıdır. Özyinelemeli yöntem ise kodun daha okunabilir olmasını sağlar.
2. Head işaretçisini neden değiştirmemeliyiz?
Head, listenin başlangıç noktasını gösterir. Değiştirirseniz, tüm listeye erişimi kaybedersiniz. Bu nedenle daima geçici bir işaretçiyle gezinilmelidir.
3. Java’da this.size değişkeni varsa neden sayıyoruz?
Bazı sınıflar uzunluğu zaten saklar. Bu rehberde algoritmik olarak düğüm sayımı anlatılmıştır.
4. Zaman karmaşıklığı neden O(N)?
Her düğüm yalnızca bir kez ziyaret edilir, bu nedenle işlem süresi eleman sayısıyla orantılıdır.
5. Çok uzun listelerde recursive yöntem neden riskli olabilir?
Çünkü her çağrı için stack belleği kullanılır; bu da stack overflow hatasına neden olabilir.
🏁 Sonuç
Bağlı liste uzunluğunu bulmak, veri yapısı mantığını kavramak için mükemmel bir örnektir. Her iki yöntemi de anlamak, hem algoritmik düşünme becerinizi hem de bellek yönetimi farkındalığınızı artırır.
💡 Bu algoritmaları Rabisu Bulut platformunda test ederek performans farklarını gözlemleyebilir ve kod optimizasyonlarını deneyimleyebilirsiniz.